<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="MPEKB" id="MPEKB"><span data-lake-id="ucea21172" id="ucea21172">典型回答</span></h1>
  <p data-lake-id="ucc454852" id="ucc454852"><br></p>
  <p data-lake-id="u44f95250" id="u44f95250"><span data-lake-id="uaae4b200" id="uaae4b200">MyBatis中可以通过两种方式来实现分页：基于</span><strong><span data-lake-id="ub1aa5cf7" id="ub1aa5cf7">物理分页</span></strong><span data-lake-id="u6fb3d1d1" id="u6fb3d1d1">和基于</span><strong><span data-lake-id="ue9e4f44a" id="ue9e4f44a">逻辑分页</span></strong><span data-lake-id="ue9ad47de" id="ue9ad47de">。</span></p>
  <p data-lake-id="u56607bc6" id="u56607bc6"><span data-lake-id="u6e0ff73b" id="u6e0ff73b">​</span><br></p>
  <p data-lake-id="u1e6b28ff" id="u1e6b28ff"><span data-lake-id="ud8f0c272" id="ud8f0c272">所谓</span><strong><span data-lake-id="u0949e608" id="u0949e608">物理分页</span></strong><span data-lake-id="ubf1e76da" id="ubf1e76da">，指的是最终执行的SQL中进行分页，即SQL语句中带limit，这样SQL语句执行之后返回的内容就是分页后的结果。</span></p>
  <p data-lake-id="u49fe1321" id="u49fe1321"><span data-lake-id="u585e9a8d" id="u585e9a8d">​</span><br></p>
  <p data-lake-id="u2bbfcc53" id="u2bbfcc53"><span data-lake-id="ue8dded41" id="ue8dded41">所谓</span><strong><span data-lake-id="ucd688109" id="ucd688109">逻辑分页</span></strong><span data-lake-id="uddfc1e3b" id="uddfc1e3b">，就是在SQL语句中不进行分页，照常全部查询，在查询到的结果集中，再进行分页。</span></p>
  <p data-lake-id="ucf3faead" id="ucf3faead"><span data-lake-id="u09c25754" id="u09c25754">​</span><br></p>
  <p data-lake-id="u05ba2334" id="u05ba2334"><span data-lake-id="u7876173d" id="u7876173d">在MyBatis中，想要实现分页通常有</span><strong><span data-lake-id="uc1b4d9a0" id="uc1b4d9a0">四种做法</span></strong><span data-lake-id="u28f719ab" id="u28f719ab">：</span></p>
  <p data-lake-id="u67c12fec" id="u67c12fec"><span data-lake-id="u09c2ed17" id="u09c2ed17">​</span><br></p>
  <p data-lake-id="u9fae8b54" id="u9fae8b54"><strong><span data-lake-id="u75e0e445" id="u75e0e445">1、在SQL中添加limit语句：</span></strong></p>
  <p data-lake-id="u6723ff44" id="u6723ff44"><span data-lake-id="uf9e7b12f" id="uf9e7b12f">​</span><br></p>
  <pre lang="java"><code>
&lt;select id="getUsers" resultType="User"&gt;
    select * from user
    &lt;where&gt;
        &lt;if test="name != null"&gt;
            and name like CONCAT('%',#{name},'%')
        &lt;/if&gt;
    &lt;/where&gt;
    limit #{offset}, #{limit}
&lt;/select&gt;

</code></pre>
  <p data-lake-id="u66fb00fb" id="u66fb00fb"><strong><span data-lake-id="u3f4b5d54" id="u3f4b5d54">​</span></strong><br></p>
  <p data-lake-id="u1521d114" id="u1521d114"><strong><span data-lake-id="u0fe91870" id="u0fe91870">2、基于PageHelper分页插件，实现分页：</span></strong></p>
  <p data-lake-id="u9862253f" id="u9862253f"><span data-lake-id="uac80d28d" id="uac80d28d">​</span><br></p>
  <p data-lake-id="ubd378d7b" id="ubd378d7b"><span data-lake-id="uad51ea55" id="uad51ea55">在使用PageHelper时，只需要在查询语句前调用PageHelper.startPage()方法，然后再进行查询操作。PageHelper会自动将查询结果封装到一个PageInfo对象中，包含了分页信息和查询结果。</span></p>
  <p data-lake-id="u0e10db8b" id="u0e10db8b"><span data-lake-id="uddce1184" id="uddce1184">​</span><br></p>
  <pre lang="java"><code>
// Java代码中使用 PageHelper
PageHelper.startPage(1, 10);
List&lt;User&gt; userList = userMapper.getUsers();
PageInfo&lt;User&gt; pageInfo = new PageInfo&lt;&gt;(userList);
</code></pre>
  <p data-lake-id="u414a517f" id="u414a517f"><br></p>
  <p data-lake-id="u93e413db" id="u93e413db"><strong><span data-lake-id="u91806c92" id="u91806c92">使用PageHelper时，不需要在mapper.xml文件中使用limit语句。</span></strong></p>
  <p data-lake-id="u054cc764" id="u054cc764"><strong><span data-lake-id="ufc6a3d5f" id="ufc6a3d5f">​</span></strong><br></p>
  <p data-lake-id="u29c32875" id="u29c32875"><strong><span data-lake-id="uc4059feb" id="uc4059feb">​</span></strong><br></p>
  <p data-lake-id="ud76a4f69" id="ud76a4f69"><strong><span data-lake-id="uc391c3ab" id="uc391c3ab">3、基于RowBounds实现分页</span></strong></p>
  <p data-lake-id="ud5c3f72a" id="ud5c3f72a"><span data-lake-id="uce611bd4" id="uce611bd4">​</span><br></p>
  <p data-lake-id="u7055a5d2" id="u7055a5d2"><span data-lake-id="ue44eda27" id="ue44eda27">RowBounds是MyBatis中提供的一个分页查询工具，其中可以设置offset和limit用于分页。</span></p>
  <p data-lake-id="u3f592953" id="u3f592953"><strong><span data-lake-id="u60c721f3" id="u60c721f3">​</span></strong><br></p>
  <pre lang="java"><code>
int offset = 10; // 偏移量
int limit = 5; // 每页数据条数
RowBounds rowBounds = new RowBounds(offset, limit);
List&lt;User&gt; userList = sqlSession.selectList("getUsers", null, rowBounds);
</code></pre>
  <p data-lake-id="u502fba8d" id="u502fba8d"><strong><span data-lake-id="u701c04ab" id="u701c04ab">​</span></strong><br></p>
  <p data-lake-id="udcd1e65b" id="udcd1e65b"><strong><span data-lake-id="u11aaa38b" id="u11aaa38b">4、基于</span></strong><strong><span data-lake-id="u6095f37b" id="u6095f37b" style="color: rgb(38, 38, 38)">MyBatis-Plus实现分页</span></strong></p>
  <p data-lake-id="u19029779" id="u19029779"><span data-lake-id="u9947c9e9" id="u9947c9e9">​</span><br></p>
  <p data-lake-id="u99a3bf72" id="u99a3bf72"><span data-lake-id="u3c07898c" id="u3c07898c">MyBatis-Plus中提供了分页插件，可实现简单易用的分页功能，可以根据传入的分页参数自动计算出分页信息，无需手动编写分页SQL语句。<br><br></span></p>
  <pre lang="java"><code>
public interface UserMapper extends BaseMapper&lt;User&gt; {
 List&lt;User&gt; selectUserPage(Page&lt;User&gt; page, @Param("name") String name);
}
</code></pre>
  <p data-lake-id="u150933e1" id="u150933e1"><br></p>
  <p data-lake-id="udebb8230" id="udebb8230" style="text-align: right"><br></p>
  <p data-lake-id="u4c619366" id="u4c619366"><strong><span data-lake-id="u6e9a23b2" id="u6e9a23b2">以上四种做法中，能实现逻辑分页的是RowBounds和</span></strong><strong><span data-lake-id="u517fd8a6" id="u517fd8a6" style="color: rgb(38, 38, 38)">MyBatis-Plus，能实现物理分页的是手动添加limit、</span></strong><strong><span data-lake-id="u751d8d3a" id="u751d8d3a">PageHelper以及</span></strong><strong><span data-lake-id="uec211166" id="uec211166" style="color: rgb(38, 38, 38)">MyBatis-Plus</span></strong></p>
  <p data-lake-id="u1a83713e" id="u1a83713e"><br></p>
  <p data-lake-id="u153b93e8" id="u153b93e8"><br></p>
  <p data-lake-id="u0e0c7481" id="u0e0c7481"><span data-lake-id="uea397036" id="uea397036">物理分页和逻辑分页，工作中推荐使用那种分页呢？</span></p>
  <p data-lake-id="u4219bb63" id="u4219bb63"><br></p>
  <p data-lake-id="u26f4712d" id="u26f4712d"><span data-lake-id="u5e4ab10e" id="u5e4ab10e" class="lake-fontsize-11" style="color: var(--larkx-editor-text-color)">数据小的话无所谓，逻辑分页更简单点，数据量大的话，一定是物理分页，避免查询慢，也避免内存被撑爆、</span></p>
  <p data-lake-id="u3fc18057" id="u3fc18057"><span data-lake-id="u233b7765" id="u233b7765">​</span><br></p>
  <p data-lake-id="u85fd8232" id="u85fd8232"><span data-lake-id="u62a03a64" id="u62a03a64">​</span><br></p>
 </body>
</html>